﻿//【题目描述】
//读入一个n∗n的矩阵，对于一个矩阵有以下两种操作
//1:顺时针旋180°
//2: 关于行镜像
//如
//[1  2]  |  [3  4]
//[3  4]  |  [1  2]
//给出q个操作，输出操作完的矩阵
//
//输入描述 :
//	第一行一个数n(1≤n≤1000)，表示矩阵大小
//	接下来n行，每行n个数，描述矩阵，其中数字范围为[1, 2000]
//	一下来一行一个数q(1≤q≤100000)，表示询问次数
//	接下来q行，每行一个数x(x = 1或x = 2)，描述每次询问
//输出描述 :
//	n行，每行n个数，描述操作后的矩阵
//
//输入
//	2
//	1 2
//	3 4
//	1
//	1
//输出
//	4 3
//	2 1
//
//输入
//	2
//	1 2
//	3 4
//	1
//	2
//输出
//	3 4
//	1 2

#include <iostream>
using namespace std;
const int N = 1010;
int n;
int g[N][N];
void setRow() // ⾏对称
{
	for (int i = 0; i < n / 2; i++)
	{
		for (int j = 0; j < n; j++)
		{
			swap(g[i][j], g[n - 1 - i][j]);
		}
	}
}
void setCol() // 列对称
{
	for (int j = 0; j < n / 2; j++)
	{
		for (int i = 0; i < n; i++)
		{
			swap(g[i][j], g[i][n - 1 - j]);
		}
	}
}
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> g[i][j];
		}
	}

	int q, x;
	cin >> q;

	int row = 0, col = 0;
	while (q--)
	{
		cin >> x;
		if (x == 1) row++, col++;
		else row++;
	}

	row %= 2; col %= 2;
	if (row) setRow();
	if (col) setCol(); for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << g[i][j] << " ";
		}
		cout << endl;
	}

	return 0;
}







